import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created with IntelliJ IDEA.
 * Description:通过反射操作一个实体对象
 * Date: 2024-09-06
 * Time: 10:15
 */
public class ReflectExample {
    public static void main(String[] args) {
        try {
            //拿到Person类的引用
            Class<?> personClass = Class.forName("Person");

            //拿到Person类的构造方法
            Constructor<?> personConstructor = personClass.getConstructor(String.class, int.class);

            //通过构造方法示例出一个Person类的对象
            Object personInstance = personConstructor.newInstance("张三", 20);

            //拿到Person类的introduce方法
            Method introduceMethod = personClass.getMethod("introduce");
            //使用该方法
            introduceMethod.invoke(personInstance);

            //拿到Person类的一个字段
            Field nameField = personClass.getDeclaredField("name");
            //设置许可
            nameField.setAccessible(true);
            //修改Person类的一个对象的name字段
            nameField.set(personInstance,"Bob");


            //再次调用introduce方法
            introduceMethod.invoke(personInstance);

            Field ageField = personClass.getDeclaredField("age");
            ageField.setAccessible(true);
            ageField.set(personInstance,18);

            introduceMethod.invoke(personInstance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}